const lcs_nodeTag = 'lcs_node';

const lcs_node_prop_child_node_arr = 'child_node_arr';

class lcs_node {
  get [Symbol.toStringTag]() {
    return lcs_nodeTag;
  }

  constructor(x_ind, y_ind, val) {
    this.x_ind = x_ind;
    this.y_ind = y_ind;
    this.value = val;
  }

  #_deepth = 1;

  get deepth() {
    // 已经计算过 的值
    if (this.#_deepth > 1) {
      return this.#_deepth;
    }

    // 无 子元素
    if (this[lcs_node_prop_child_node_arr].length == 0) {
      return this.#_deepth;
    }

    // 计算 和 缓存 最长 长度
    /**
     * @type {lcs_node}
     */
    let cur_child_node;

    let cur_length = 0;

    let i = 0;

    do {
      cur_child_node = this[this[lcs_node_prop_child_node_arr][i++]];

      cur_length = Math.max(cur_length, cur_child_node.deepth + 1);
    } while (i < this[lcs_node_prop_child_node_arr].length);
    this.#_deepth = cur_length;
    // console.log(this.#_deepth);
    return this.#_deepth;
  }

  /**
   * 主 序列 索引位置
   * @type {number}
   */
  x_ind;

  /**
   * 次 序列 索引位置
   * @type {number}
   */
  y_ind;

  value;

  /**
   * 符合 信息 结构 的 剩余 节点
   */
  [lcs_node_prop_child_node_arr] = [];
}

export { lcs_node, lcs_node_prop_child_node_arr };
